package com.zs.letcode.illustration_of_algorithm;

/**
 * 剑指 Offer 46. 把数字翻译成字符串
 * 给定一个数字，我们按照如下规则把它翻译为字符串：0 翻译成 “a” ，1 翻译成 “b”，……，11 翻译成 “l”，……，25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数，用来计算一个数字有多少种不同的翻译方法。
 * <p>
 *
 * <p>
 * 示例 1:
 * <p>
 * 输入: 12258
 * 输出: 5
 * 解释: 12258有5种不同的翻译，分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
 *
 * <p>
 * 提示：
 * <p>
 * 0 <= num < 231
 * 相关标签
 * 字符串
 * 动态规划
 * <p>
 * Go
 * <p>
 * <p>
 * <p>
 * 作者：Krahets
 * 链接：https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/99wd55/
 * 来源：力扣（LeetCode）
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 *
 * @author madison
 * @description
 * @date 2021/8/12 09:27
 */
public class Chapter16 {
    public static void main(String[] args) {

    }

    private class Solution {
        /**
         * 方法一：字符串遍历    动态规划
         *
         * @param num
         * @return
         */
        public int translateNum(int num) {
            String s = String.valueOf(num);
            int a = 1, b = 1;
            for (int i = 2; i <= s.length(); i++) {
                String tmp = s.substring(i - 2, i);
                int c = tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0 ? a + b : a;
                b = a;
                a = c;
            }
            return a;
        }

        /**
         * 方法二：数字求余
         */
        public int translateNum1(int num) {
            int a = 1, b = 1, x, y = num % 10;
            while (num > 9) {
                num /= 10;
                x = num % 10;
                int tmp = 10 * x + y;
                int c = (tmp >= 10 && tmp <= 25) ? a + b : a;
                b = a;
                a = c;
                y = x;
            }
            return a;
        }
    }
}
